Guice-এর Assisted Injection প্যাটার্ন ব্যবহার করে Factory Pattern-এর মাধ্যমে নির্দিষ্ট ডিপেনডেন্সিগুলির জন্য ইনজেকশন পরিচালনা করা যেতে পারে। Assisted Injection হল একটি বিশেষ ধরনের ডিপেনডেন্সি ইনজেকশন যা Guice-এ সাধারণত Factory ব্যবহার করে রিয়েল টাইমে কনস্ট্রাক্টর প্যারামিটার ইনজেক্ট করার জন্য ব্যবহৃত হয়। এটি বিশেষ করে তখন কার্যকর যখন ডিপেনডেন্সি গুলি runtime এ সৃষ্ট হয় এবং আপনি চান যে Guice সেই ডিপেনডেন্সি ইনজেক্ট করুক।
Assisted Injection এবং Factory Pattern
Assisted Injection একটি প্যাটার্ন যা Guice এর মাধ্যমে Factory Pattern-এর সাথে একত্রে কাজ করতে সক্ষম। এখানে, আপনি একটি factory interface তৈরি করেন যা নির্দিষ্ট ইনপুট প্যারামিটার সহ ইনস্ট্যান্স তৈরি করে এবং সেই ইনপুটগুলিকে Guice দ্বারা ইনজেক্ট করা হয়।
Assisted Injection বাস্তবায়ন
ধাপ 1: Dependencies এবং Constructor তৈরি করুন
প্রথমে, আমাদের এমন কিছু ক্লাস তৈরি করতে হবে যার constructor এ ইনপুট প্যারামিটার রয়েছে। Guice সেই প্যারামিটারগুলিকে runtime-এ ইনজেক্ট করবে।
// PaymentService Interface
public interface PaymentService {
void pay();
}
// Implementations of PaymentService
public class PaypalPaymentService implements PaymentService {
private final String accountId;
// Constructor that requires an accountId
public PaypalPaymentService(String accountId) {
this.accountId = accountId;
}
@Override
public void pay() {
System.out.println("Payment made via PayPal with account: " + accountId);
}
}
public class CreditCardPaymentService implements PaymentService {
private final String cardNumber;
// Constructor that requires a cardNumber
public CreditCardPaymentService(String cardNumber) {
this.cardNumber = cardNumber;
}
@Override
public void pay() {
System.out.println("Payment made via Credit Card with card number: " + cardNumber);
}
}
এখানে, PaypalPaymentService এবং CreditCardPaymentService এর কনস্ট্রাক্টর প্যারামিটার হিসাবে একটি String গ্রহণ করে (যা একে runtime-এ ইনজেক্ট করতে হবে)।
ধাপ 2: Factory Interface তৈরি করুন
এখন, আমরা একটি Factory Interface তৈরি করব, যা PaymentService এর ইনস্ট্যান্স তৈরি করবে এবং runtime-এ প্যারামিটার ইনজেক্ট করবে।
import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.AssistedInject;
// Factory interface with Assisted Injection
public interface PaymentServiceFactory {
PaymentService create(@Assisted("accountId") String accountId); // For PaypalPaymentService
PaymentService create(@Assisted("cardNumber") String cardNumber); // For CreditCardPaymentService
}
এখানে, @Assisted অ্যানোটেশনটি Guice কে নির্দেশ দেয় যে, PaymentServiceFactory এর create() মেথডে runtime parameters ইনজেক্ট করা হবে।
ধাপ 3: Guice Module তৈরি করুন
এখন, আমাদের একটি Guice module তৈরি করতে হবে যেখানে আমরা @AssistedInject এবং Factory সঠিকভাবে কনফিগার করব।
import com.google.inject.AbstractModule;
import com.google.inject.assistedinject.FactoryModuleBuilder;
public class PaymentModule extends AbstractModule {
@Override
protected void configure() {
// Use FactoryModuleBuilder to create Assisted Injection factory
install(new FactoryModuleBuilder().build(PaymentServiceFactory.class));
}
}
এখানে, FactoryModuleBuilder Guice এর মাধ্যমে Factory Pattern কে সমর্থন করে এবং PaymentServiceFactory তৈরি করে যা runtime প্যারামিটার সহ PaymentService ইনস্ট্যান্স তৈরি করবে।
ধাপ 4: Guice Injector দিয়ে ইনস্ট্যান্স তৈরি করুন
এখন আমরা Guice Injector ব্যবহার করে PaymentServiceFactory এর একটি ইনস্ট্যান্স তৈরি করব এবং এর মাধ্যমে প্যারামিটার সহ ইনজেক্ট করা PaymentService ব্যবহার করব।
import com.google.inject.Guice;
import com.google.inject.Injector;
public class PaymentApp {
public static void main(String[] args) {
// Create Guice injector
Injector injector = Guice.createInjector(new PaymentModule());
// Get the PaymentServiceFactory instance
PaymentServiceFactory factory = injector.getInstance(PaymentServiceFactory.class);
// Create PaypalPaymentService with assisted accountId parameter
PaymentService paypalService = factory.create("paypal_account_123");
paypalService.pay(); // Output: Payment made via PayPal with account: paypal_account_123
// Create CreditCardPaymentService with assisted cardNumber parameter
PaymentService cardService = factory.create("card_456");
cardService.pay(); // Output: Payment made via Credit Card with card number: card_456
}
}
Explanation:
PaymentServiceFactory.create()মেথডে আমরা runtime-এ প্যারামিটার (যেমনaccountIdবাcardNumber) ইনজেক্ট করেছি।- Guice
@AssistedInjectএবং@Assistedঅ্যানোটেশন ব্যবহার করে আমরা কনস্ট্রাক্টর প্যারামিটার সরবরাহ করেছি যা Guice দ্বারা ইনজেক্ট করা হয়েছে। - Guice Injector ব্যবহার করে
PaymentServiceFactoryইনস্ট্যান্স তৈরি করা হয়েছে এবং সেই ইনস্ট্যান্সের মাধ্যমে প্যারামিটার সহPaymentServiceতৈরি করা হয়েছে।
Assisted Injection এর সুবিধা
- Flexibility:
- Assisted Injection runtime parameters সরবরাহ করার মাধ্যমে factory-based instantiation এর সুবিধা দেয়।
- আপনি dynamic values এবং parameters ইনজেক্ট করতে পারেন, যা সাধারণ constructor injection দ্বারা সম্ভব নয়।
- Factory Pattern Integration:
- Assisted Injection Guice-এ Factory Pattern সঠিকভাবে ইন্টিগ্রেট করতে সহায়ক, যেখানে runtime প্যারামিটার গ্রহণ করে ডিপেনডেন্সি তৈরি করতে পারেন।
- Separation of Concerns:
- Factory Pattern Guice-এর মাধ্যমে ডিপেনডেন্সির নির্মাণ এবং কনফিগারেশন কে একত্রিত করে, ফলে ডিপেনডেন্সি ম্যানেজমেন্ট আরও সহজ হয়।
- ক্লাসের ইনস্ট্যান্স তৈরি এবং dependency injection এর কাজটি আলাদা করা হয়।
- Factory Pattern এবং Assisted Injection Guice-এ একটি শক্তিশালী প্যাটার্ন যা runtime parameters সহ ডিপেনডেন্সি ইনজেকশন সরবরাহ করতে পারে।
@Assistedএবং@AssistedInjectঅ্যানোটেশন ব্যবহার করে Factory Interface তৈরি করা যায়, যা প্যারামিটার ইনজেক্ট করতে এবং runtime-এ dependency creation করতে সাহায্য করে।- এটি flexible এবং dynamic ডিপেনডেন্সি ইনজেকশন প্রক্রিয়া তৈরি করতে সহায়ক, এবং এটি decoupling এবং modularity বজায় রাখতে সাহায্য করে।
Read more